package be.kdg.bombermanunlimited.client.network;

import java.io.IOException;
import java.net.UnknownHostException;

import be.kdg.bombermanunlimited.client.network.listeners.ErrorListener;
import be.kdg.bombermanunlimited.client.network.listeners.INetworkDataListener;
import be.kdg.bombermanunlimited.client.network.listeners.INetworkListener;
import be.kdg.bombermanunlimited.client.network.packet.Packet;

/**
 * Een interface die een aantal netwerk functies voorziet.
 * 
 * @author Philip
 * 
 */
public interface INetwork {
	/**
	 * Zeg tegen het netwerk dat je met een host wil connecten
	 * 
	 * @param ip
	 * @param port
	 * @throws UnknownHostException
	 * @throws IOException
	 */
	public void connect(String ip, int port) throws UnknownHostException,
			IOException;

	/**
	 * Verbreek ALLE verbindingen in het netwerk
	 */
	public void disconnect();

	/**
	 * Voeg een luisteraar toe
	 * 
	 * @param listener
	 *            De luisteraar
	 * @param packetType
	 *            Het type packet waarnaar de luisteraar wil luisteren (bv
	 *            ChatPacket.class)
	 */
	public void addDataListener(INetworkDataListener listener,
			Class<? extends Packet> packetType);

	/**
	 * Voeg een netwerk luisteraar toe
	 * 
	 * @param listener
	 */
	public void addNetworkListener(INetworkListener listener);

	/**
	 * Voeg een luisteraar naar errors toe
	 * 
	 * @param listener
	 */
	public void addErrorListener(ErrorListener listener);

	/**
	 * verwijder de luisteraar
	 * 
	 * @param listener
	 */
	public void removeErrorListener(ErrorListener listener);

	/**
	 * verwijder de luisteraar
	 * 
	 * @param listener
	 */
	public void removeDataListener(INetworkDataListener listener);

	/**
	 * Verwijder de luisteraar.
	 * 
	 * @param listener
	 * @param packetType
	 *            De packettypes waarnaar je niet meer wil luisteren.
	 */
	public void removeDataListener(INetworkDataListener listener,
			Class<? extends Packet> packetType);

	/**
	 * verwijder de luisteraar
	 * 
	 * @param listener
	 */
	public void removeNetworkListener(INetworkListener listener);

	/**
	 * Stuur een packet
	 * 
	 * @param packet
	 */
	public void sendData(Packet packet);

	/**
	 * Controlleert of er nog connecties zijn
	 * 
	 * @return true als het netwerk nog verbonden is met minstens 1 ander
	 *         netwerk, anders false.
	 */
	public boolean hasConnections();
}
